%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%W  Update                      GAP Maintenance
%%
%%
%Y  Copyright (C)  2005,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany
%%
%%  This file is intended to list the changes that will be published with
%%  the next update of GAP.
%%  The information is used for producing the announcement of the update,
%%  the additions to `tst/bugfix.tst', and an HTML page that lists the
%%  known bugs and intended new features.
%%
%%  For adding a change, just copy one of the templates below to the end of the
%%  file, and enter the relevant information.
%%
%%  Formal rules for this file, to allow simple parsing by a script:
%%          - lines starting with `%' are comments and are ignored
%%          - lines starting with `!' describe the type of information
%%            in the following lines until the next `!'-line
%%          - each entry must be finished with an `! End' line, otherwise
%%            the order of entries is irrelevant
%%          - the text behind the `!' is case and whitespace insensitive
%%

%%%%%%%%%%%%  short template without comments, below is a longer one  %%%%%%%%
! Date

! Changed by

! Reported by

! Type of Change
Fix: wrong result
Fix: inappropriate error message
Fix: infinite loop
Fix: efficiency issue
Fix: crash
Fix: internal data corruption
New: extended functionality
New: new functionality
New: improved documentation

! Description

! Test Code

! Prefetch

! Changed Files

! End



%%%%%%%%%%%%  Template with explanatory comments    %%%%%%%%%%%%%%%%%%%%%%%%%%
% When the change was checked in, format 'yyyy/mm/dd':
! Date

% Initials should suffice here:
! Changed by

% Only if applicable:
! Reported by

% Choose one or more entries and/or add new ones; but always use either
% the 'Fix:' or the 'New:' prefix
! Type of Change
Fix: wrong result
Fix: inappropriate error message
Fix: infinite loop
Fix: efficiency issue
Fix: crash
New: extended functionality
New: new functionality
New: improved documentation

% For the description use (X)HTML (preferred) or plain text:
% For HTML use in particular the following markup:
%     for package names: <span class="pkgname">...</span>
%     for GAP names: <span class="code">...</span>
! Description

% If possible, provide some code in test file format which allows to check
% if a change was applied to an installation. Provide input and output,
% including prompts, exactly as in a GAP session.
! Test Code

% If possible, provide some information about a temporary fix, workaround,
% ..., maybe with a link to some longer description or a file with some
% code. Use (X)HTML here.
! Prefetch

% White space separated list of paths relative to the GAP root directory.
% (This is implicitly contained in the data of the CVS repository, but in
% case of problems after changes it may be convenient to have this
% information here.)
! Changed Files

% Finish your entry with this:
! End


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/05/17
! Changed by
AH
! Reported by
John Jones
! Type of Change
Fix: runs into error
! Description
When testing for conjugacy of a primitive group to an imprimitive group,
<span class="pkgname">GAP</span> runs into an error in EARNS calculation.
! Changed Files
lib/stbcbckt.gi
! Test Code
gap> IsConjugate(TransitiveGroup(9,19),Group([ (2,8,9,3)(4,6,7,5),
> (2,9)(3,8)(4,7)(5 ,6), (1,2,9)(3,4,5)(6,7,8), (1,4,7)(2,5,8)(3,6,9) ]),
> Group([ (3,7)(4,8)(5,6), (2,9)(3,8)(4,7)(5,6),(1,7,4)(2,8,5)(3,9,6),
> (1,6,5)(2,7,3)(4,9,8) ]));;
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/05/13
! Changed by
SL
! Reported by
Chris Wensley
! Type of Change
Fix: Compilation problem
! Description
An old DEC compiler doesn't like C preprocessor directives that are 
preceded by whitespace. Removed such whitespace.
! Changed Files
src/system.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/05/18
! Changed by
TB
! Reported by
Manuel Delgado
! Type of Change
Fix: efficiency issue
! Description
Computing an enumerator for a semigroup required too much time
because it used all elements instead of the given generators.
! Test Code
gap> t:= Runtime();;
gap> CayleyGraphSemigroup( Monoid( Transformation([2,3,4,5,6,1,7]),
>      Transformation([6,5,4,3,2,1,7]), Transformation([1,2,3,4,6,7,7]) ) );;
gap> if Runtime() - t > 5000 then 
>      Print( "#E  efficiency problem with enumerators of semigroups!\n" );
> fi;
! Prefetch
Read <a href="http://www.math.rwth-aachen.de/~Thomas.Breuer/gapfix/fix_smgideal_4_4_5">
this file</a> in order to fix the problem.
! Changed Files
lib/semigrp.gi
lib/smgideal.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
! Date
2005/06/06
! Changed by
AH
! Type of Change
Fix: error message
! Description
Groebner basis code ran into problems when comparing monomial orderings.
! Changed Files
lib/groebner.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/06
! Changed by
AH
! Type of Change
Fix: error message
! Description
Wrong choice of prime in Dixon-Schneider if prime is bigger than group order
(if group has large exponent).
! Test Code
gap> Irr(SmallGroup(516,11));;
! Changed Files
lib/ctblgrp.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/06
! Changed by
AH
! Type of Change
Fix: error message
! Description
Avoid potential error message when working with automorphism groups.
! Changed Files
lib/morpheus.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/08
! Changed by
SL
! Type of Change
New: new functionality
! Description
Added fast kernel implementation of Tarjan's 
algorithm for strongly connected components of a 
directed graph. 
! Test Code
gap> gamma := [[2,5],[3],[4,5],[1],[]];
[ [ 2, 5 ], [ 3 ], [ 4, 5 ], [ 1 ], [  ] ]
gap> STRONGLY_CONNECTED_COMPONENTS_DIGRAPH(gamma);
[ [ 5 ], [ 1, 2, 3, 4 ] ]
! Changed Files
src/listfunc.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/13
! Changed by
AH
! Type of Change
Fix: wrong result
! Description
<mixer manual="Reference: NaturalHomomorphismByNormalSubgroup">
<span class="code">NaturalHomomorphismByNormalSubgroup</span>
</mixer> for FpGroups did unnecessary rewrites.
! Changed Files
lib/ghomfp.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/13
! Changed by
AH
! Type of Change
Fix: wrong result
! Description
The alternating group A3 incorrectly claimed to be not simple.
! Test Code
gap> IsSimple(AlternatingGroup(3));
true
! Changed Files
grp/basicprm.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/17
! Changed by
SL
! Type of Change
Fix: wrong result

! Description
The undocumented function (but recently advertised on gap-dev) 
<mixer manual="Reference: COPY_LIST_ENTRIES"><span class="code">
COPY_LIST_ENTRIES</span></mixer> did not handle overlapping source and
destination areas correctly in some cases.
! Test Code
gap> l := [1,2,3,4];
[ 1, 2, 3, 4 ]
gap> COPY_LIST_ENTRIES(l,2,1,l,3,1,3);
gap> l;
[ 1, 2, 2, 3, 4 ]
! Changed Files
src/listfunc.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/19
! Changed by
SL
! Type of Change
Fix: efficiency issue
! Description
New kernel methods for taking the intersection and difference between
sets of substantially different sizes give a big performance increase.
! Changed Files
src/set.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/21
! Changed by
AH,FL
! Type of Change
Fix: efficiency issue
! Description
The commands
<mixer manual="Reference: IsNaturalSymmetricGroup"><span class="code">
IsNaturalSymmetricGroup</span></mixer> and
<mixer manual="Reference: IsNaturalAlternatingGroup"><span class="code">
IsNaturalAlternatingGroup</span></mixer> are faster and should run much less
often into inefficient tests.
! Changed Files
lib/gpprmsya.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

! Date
2005/06/22
! Changed by
Max
! Reported by
Klaus Lux
! Type of Change
Fix: crash
! Description
After lots of computations with compressed GF(2) vectors 
<span class="pkgname">GAP</span> occasionally
crashed. The reason were three missing 
<span class="code">CHANGED_BAG</span>s in <span class="code">
SemiEchelonPListGF2Vecs</span>.
They were missing, because a garbage collection could be triggered during
the computation such that newly created bags could become "old".
Test code is not possible to provide because the error condition
cannot easily be reproduced.
! Changed Files
src/vecgf2.c
! Prefetch
If you need a fix urgently, just download 
<a href="http://www.math.rwth-aachen.de/~Max.Neunhoeffer/vecgf2.c">vecgf2.c</a>
and copy it into the <span class="code">src</span> directory of your 
<span class="pkgname">GAP</span> distribution and recompile.
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/06/23
! Changed by
AH
! Type of Change
Fix: wrong result
! Description
<mixer manual="Reference: ExponentSyllable"><span class="code">
ExponentSyllable</span></mixer> for straight line program elements
gave a wrong result.

! Test Code
gap> LoadPackage("Crisp");;
gap> h:=Source(EpimorphismSchurCover(SmallGroup(64,150)));;
gap> NormalSubgroups( Centre( h ) );;
! Changed Files
lib/straight.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/09
! Changed by
AH
! Type of Change
Fix: crash
! Description
Problem in composition series for permutation groups for non-Frobenius
groups with regular point stabilizer.
! Test Code
gap> CompositionSeries(PerfectGroup(IsPermGroup,262440,1));;
! Changed Files
lib/grpprmcs.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/12
! Changed by
AH
! Type of Change
Fix: efficiency
! Changed Files
lib/grpfp.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/13
! Changed by
JS
! Type of Change
Fix: inappropriate error message
! Description
The <mixer manual="Reference: Finite Perfect Groups">perfect group library
</mixer> is split into several files which are loaded and
unloaded to keep memory usage down.
The global variable <span class="code">PERFSELECT</span> is a blist which
indicates which orders are currently loaded. An off-by-one error wrongly added
the last order of the previous file into the list of valid orders when a new
file was loaded. A subsequent access to this order raises an error.
! Test Code
gap> PerfectGroup(7800,1);; # load perf2.grp
gap> PerfectGroup(7680,1);; # should load perf1.grp, gives error in 4.4.5
! Changed Files
grp/perf.grp
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/13
! Changed by
JS
! Type of Change
Fix: wrong result
! Description
The perfect group library does not contain any information on the trivial
group, so the trivial group must be handled specially.
<mixer manual="Reference: PerfectGroup"><span class="code">
PerfectGroup</span></mixer> and
<span class="code">NrPerfectLibraryGroups</span> were changed
to indicate that the trivial group is not part of the library.
! Test Code
gap> NrPerfectLibraryGroups(1);
0
! Changed Files
grp/perf.grp
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/18
! Changed by
FL
! Reported by
Marco Costantini
! Type of Change
Fix: crash
! Description
Minor bug that crashed <span class="pkgname">GAP</span>:
The type of <span class="code">IMPLICATIONS</span>
could not be determined in a fresh session.
! Test Code
gap> TypeObj(IMPLICATIONS);;
! Changed Files
lib/init.g
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/18
! Changed by
FL
! Type of Change
New: extended functionality
! Description
Now <mixer manual="Reference: IsProbablyPrimeInt"><span class="code">
IsProbablyPrimeInt</span></mixer> can be used with larger numbers. 
(Made internal function <span class="code">TraceModQF</span> non-recursive.)
! Test Code
# takes too long in repeatedly running  tests
# IsProbablyPrimeInt(2^9689-1);
! Changed Files
lib/integer.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/20
! Changed by
SK
! Type of Change
New: new functionality
! Description
Some very basic functionality for floats.
! Test Code
gap> Float(355/113);
3.14159
gap> Rat(last);
355/113
gap> 1/4*last2;
0.785398
! Changed Files
lib/float.g
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/20
! Changed by
SK
! Type of Change
New: new functionality
! Description
A new operation <mixer manual="Reference: PadicValuation"><span class="code">
PadicValuation</span></mixer> and a corresponding method for rationals.
! Test Code
gap> PadicValuation(288/17,2);
5
! Changed Files
lib/ring.gd
lib/rational.gi
doc/build/rings.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/20
! Changed by
TB
! Type of Change
Fix: wrong result
! Description
The generator names constructed by
<mixer manual="Reference: AlgebraByStructureConstants"><span class="code">
AlgebraByStructureConstants</span></mixer> were nonsense.
! Test Code
gap> T:= EmptySCTable( 2, 0 );;
gap> SetEntrySCTable( T, 1, 1, [ 1/2, 1, 2/3, 2 ] );
gap> A:= AlgebraByStructureConstants( Rationals, T, "A." );;
gap> GeneratorsOfAlgebra( A );
[ A.1, A.2 ]
! Changed Files
lib/algsc.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/20
! Changed by
TB
! Reported by
Marcus Bishop
! Type of Change
New: extended functionality
! Description
The generators of full s. c. algebras can now be accessed with the dot
operator.
! Test Code
gap> T:= EmptySCTable( 2, 0 );;
gap> SetEntrySCTable( T, 1, 1, [ 1/2, 1, 2/3, 2 ] );
gap> A:= AlgebraByStructureConstants( Rationals, T );;  A.1;
v.1
! Changed Files
lib/algsc.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/20
! Changed by
TB
! Reported by
Randy Cone
! Type of Change
Fix: wrong result
! Description
The elements in a free magma ring have the filter
<mixer manual="Reference: IsAssociativeElement"><span class="code">
IsAssociativeElement</span></mixer> set
whenever the elements in the underlying magma and in the coefficients ring
have this filter set.
! Test Code
gap> F:= FreeAssociativeAlgebra( Rationals, 2 );;
gap> IsAssociativeElement( F.1 );
true
gap> F:= FreeAlgebra( Rationals, 2 );;
gap> IsAssociativeElement( F.1 );
false
! Prefetch
Read <a href="http://www.math.rwth-aachen.de/~Thomas.Breuer/gapfix/fix_mgmring_4_4_5">
this file</a> in order to fix the problem.
! Changed Files
lib/mgmring.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/21
! Changed by
FL
! Type of Change
New: extended functionality
! Description
New Conway polynomials computed by Kate Minola, John Bray, Richard Parker.
! Test Code
gap> IsCheapConwayPolynomial(5, 55);
true
gap> IsCheapConwayPolynomial(2, 108);
true
! Changed Files
lib/polyconw.gi
lib/conwdat1.g
lib/conwdat2.g
lib/conwdat3.g
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/21
! Changed by
JS
! Type of Change
Fix: wrong result
! Description
The descriptions of <span class="code">PerfectGroup(734832,3)</span>
and <span class="code">PerfectGroup(864000,3)</span> were corrected
in the <mixer manual="Reference: Finite Perfect Groups">library of perfect 
groups</mixer>.
! Test Code
gap> G:=PerfectGroup(IsPermGroup,734832,1);;
gap> H:=PerfectGroup(IsPermGroup,734832,2);;
gap> K:=PerfectGroup(IsPermGroup,734832,3);;
gap> Assert(0,H<>K); # Fails in 4.4.5
gap> Assert(0,Size(G)=734832 and IsPerfectGroup(G)); # Sanity check
gap> Assert(0,Size(H)=734832 and IsPerfectGroup(H)); # Sanity check
gap> Assert(0,Size(K)=734832 and IsPerfectGroup(K)); # Sanity check
gap> Assert(0,Size(Complementclasses(G,SylowSubgroup(FittingSubgroup(G),3)))=1); # Iso check
gap> Assert(0,Size(Complementclasses(H,SylowSubgroup(FittingSubgroup(H),3)))=3); # Iso check
gap> Assert(0,Size(Complementclasses(K,SylowSubgroup(FittingSubgroup(K),3)))=0); # Iso check
gap> List([1,2,3],k->IdGroup(SylowSubgroup(PerfectGroup(IsPermGroup,864000,k),2)));
[ [ 256, 55700 ], [ 256, 55970 ], [ 256, 56028 ] ]
! Changed Files
grp/perf11.grp
grp/perf12.grp
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/22
! Changed by
SK
! Type of Change
New: new functionality
! Description
A new attribute <mixer manual="Reference: EpimorphismFromFreeGroup"><span 
class="code">EpimorphismFromFreeGroup</span></mixer>.
The code has been written by Alexander Hulpke.
! Test Code
gap> EpimorphismFromFreeGroup(SymmetricGroup(4));
[ x1, x2 ] -> [ (1,2,3,4), (1,2) ]
! Changed Files
lib/ghomfp.gd
lib/ghomfp.gi
doc/build/groups.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/07/22
! Changed by
SK
! Type of Change
New: extended functionality
! Description
The functions
<mixer manual="Reference: Lambda"><span class="code">Lambda</span></mixer>,
<mixer manual="Reference: Phi"><span class="code">Phi</span></mixer>,
<mixer manual="Reference: Sigma"><span class="code">Sigma</span></mixer>, and
<mixer manual="Reference: Tau"><span class="code">Tau</span></mixer>
have been turned into operations, to admit the installation of methods
for arguments other than integers.
! Test Code
gap> ForAll([Lambda,Phi,Sigma,Tau],IsOperation);
true
! Changed Files
lib/numtheor.gd
lib/numtheor.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/08
! Changed by
CMRD
! Type of Change
New: extended functionality
! Description
The <mixer manual="Reference: Primitive Permutation Groups">primitive groups
library</mixer> has been extended to degree 2499.
! Test Code
gap> AllPrimitiveGroups( Size, 60 );;
#W  AllPrimitiveGroups: Degree restricted to [ 1 .. 2499 ]
! Changed Files
prim/cohorts.grp
prim/primitiv.gd
prim/primitiv.gi
prim/primitiv.grp
prim/grps*
doc/manual.bib
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/10
! Changed by
TB
! Type of Change
Fix: efficiency issue
! Description
Up to now, the method installed for testing the membership of rationals
in the field of rationals via
<mixer manual="Reference: IsRat"><span class="code">IsRat</span></mixer>
was not called; instead a more general method was used that called
<mixer manual="Reference: Conductor"><span class="code">
Conductor</span></mixer> and thus was much slower.
Now the special method has been ranked up by changing the requirements
in the method installation.
! Test Code
gap> ApplicableMethod( \in, [ 1, Rationals ] );   
function( x, Rationals ) ... end
! Changed Files
lib/fldabnum.gd
lib/rational.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/11
! Changed by
TB
! Type of Change
New: extended functionality
! Description
Up to now, one could assign only lists with
<mixer manual="Prg Tutorial: InstallFlushableValue"><span class="code">
InstallFlushableValue</span></mixer>.
Now also records are admitted.
! Test Code
gap> DeclareGlobalVariable( "TestVariable" );
gap> InstallFlushableValue( TestVariable, rec() );
gap> MakeReadWriteGlobal( "TestVariable" );  UnbindGlobal( "TestVariable" );
! Changed Files
lib/variable.g
lib/oper1.g
src/c_oper1.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/11
! Changed by
TB
! Type of Change
New: extended functionality
! Description
<mixer manual="Prg Tutorial: InstallMethod"><span class="code">
InstallMethod</span></mixer> now admits entering a list of
strings instead of a list of required filters.
Each such string must evaluate to a filter when used as the argument of
<mixer manual="Reference: EvalString"><span class="code">
EvalString</span></mixer>.
The advantage of this variant is that these strings are used to compose
an info string (which is shown by <span class="code">ApplicableMethod</span>)
that reflects exactly the required filters.
! Test Code
gap> DeclareOperation( "TestOperation", [ IsGroup, IsGroup ] );
gap> InstallMethod( TestOperation, [ "IsGroup and IsAbelian", "IsGroup" ],
>        function( G, H ) return true; end );
gap> MakeReadWriteGlobal( "TestOperation" );  UnbindGlobal( "TestOperation" );
! Changed Files
lib/oper1.g
lib/string.gd
src/c_oper1.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/11
! Changed by
TB
! Reported by
Max Neunhöffer
! Type of Change
Fix: wrong result
! Description
The function <mixer manual="Prg Tutorial: InstallValue"><span class="code">
InstallValue</span></mixer> must not be used for
objects in the filter <span class="code">IsFamily</span> because these
objects are compared via <mixer manual="Reference: IsIdenticalObj"><span 
class="code">IsIdenticalObj</span></mixer>.
! Test Code
# gap> fam:= NewFamily( "fam" );;
# gap> DeclareGlobalVariable( "TestFam" );
# gap> InstallValue( TestFam, CollectionsFamily( fam ) );
# #I  please use `BindGlobal' for the family object CollectionsFamily(...), not \
# `InstallValue'
# gap> IsIdenticalObj( TestFam, CollectionsFamily( fam ) );
# false
# gap> MakeReadWriteGlobal( "TestFam" );  UnbindGlobal( "TestFam" );
! Changed Files
lib/ctbl.gd
lib/ctbl.gi
lib/ffe.gd
lib/ffe.gi
lib/list.g
lib/list.gd
lib/variable.g
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/15
! Changed by
SK
! Type of Change
New: new functionality
! Description
A new operation <mixer manual="Reference: PartialFactorization"><span 
class="code">PartialFactorization</span></mixer> has been
added, and a corresponding method for integers has been installed.
This method allows one to specify the amount of work to be spent on looking
for factors.
! Test Code
gap> List([0..5],i->PartialFactorization(7^64-1,i));
[ [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17,
      1868505648951954197516197706132003401892793036353 ],
  [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17, 353,
      5293217135841230021292344776577913319809612001 ],
  [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17, 353, 134818753, 47072139617,
      531968664833, 1567903802863297 ],
  [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17, 353, 1201, 169553, 7699649,
      134818753, 47072139617, 531968664833 ],
  [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17, 353, 1201, 169553, 7699649,
      134818753, 47072139617, 531968664833 ],
  [ 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 17, 353, 1201, 169553, 7699649,
      134818753, 47072139617, 531968664833 ] ]
! Changed Files
lib/integer.gd
lib/integer.gi
doc/build/integers.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/15
! Changed by
AH
! Reported by
Petr Vojtechovsky
! Type of Change
Fix: wrong convention
! Description
The centre of a magma is commonly defined to be the set of elements that
commute and associate with all elements. The previous definition left out
'associate' and caused problems with extending the functionality to
nonassociative loops.
! Test Code
gap> Centre( MagmaByMultiplicationTable( [ [ 2, 2 ], [ 2, 1 ] ] ) );
[  ]
! Changed Files
lib/magma.gd
lib/magma.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/17
! Changed by
Max
! Reported by
Klaus Lux
! Type of Change
Fix: internal data corruption
! Description
Fixed a bug in <span class="code">APPEND_VEC8BIT</span>, 
which was triggered in the following
situation: Let e be the number of field elements stored in one byte.
If a compressed 8bit-vector v had length not divisible by e and
another compressed 8bit-vector w was appended, such that the sum of
the lengths became divisible by e, then one 0 byte too much was written
which destroyed the <span class="code">TNUM</span> of the next 
<span class="pkgname">GAP</span> object in memory.
! Test Code
# Test code is not possible to provide because the error condition
# cannot be tested in a platform independent way.
! Changed Files
src/vec8bit.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/19
! Changed by
JS
! Reported by 
Luc Teirlinck
! Type of Change
Fix: inappropriate error message
! Description
<mixer manual="Reference: PermutationCycle"><span class="code">
PermutationCycle</span></mixer> returned <span class="code">fail</span> if the
cycle was not a contiguous subset of the specified domain.
! Test Code
gap> PermutationCycle((1,2,3,4,5,6)^2,[1..6],1); # returns fail in 4.4.5
(1,3,5)
! Changed Files
lib/oprt.gi
lib/oprt.gd
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/19
! Changed by
JS
! Type of Change
Fix: crash
! Description
<mixer manual="Reference: Assert"><span class="code">Assert</span></mixer>
caused an infinite loop if called
as the first line of a function called from another function. 
! Test Code
gap> f:=function() Assert(0,false); end;; g:=function() f(); end;;
gap> ##  The following should just trigger a normal error, but in 4.4.5 
gap> ##  it will send a few hundred lines before crashing:
gap> # g(); 
! Changed Files
src/stats.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/19
! Changed by
JS
! Type of Change
Fix: wrong result
! Description
The functions 
<mixer manual="Reference: EpimorphismSchurCover"><span class="code">
EpimorphismSchurCover</span></mixer> and
<mixer manual="Reference: AbelianInvariantsMultiplier"><span class="code">
AbelianInvariantsMultiplier</span></mixer>
may have produced wrong results without warning.
These problems are fixed.
However, the methods currently used can be expected to be slower than the
ones used before;
we hope to fix this for the next version of
<span class="pkgname">GAP</span>.
! Test Code
gap> g:= SmallGroup( 48, 30 );;
gap> AbelianInvariantsMultiplier( g ); # returned [ 2, 2 ] in 4.4.5
[ 2 ]
! Changed Files
lib/schur.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/22
! Changed by
JS+AH
! Type of Change
Fix: wrong result
! Description
<mixer manual="Reference: DerivedSubgroup"><span class="code">
DerivedSubgroup</span></mixer> and 
<mixer manual="Reference: CommutatorSubgroup"><span class="code">
CommutatorSubgroup</span></mixer> for permutation groups sometimes returned
groups with an incorrect stabilizer chain due to a missing verification
step after a random Schreier Sims.
! Test Code
gap> ##  The mailing lists contain more specific test code that is longer.
gap> ##  The following should never terminate, but does in 4.4.5
gap> # repeat G:=PerfectGroup(IsPermGroup,79200,3); P:=SylowSubgroup(G,11);
gap> # N:=Normalizer(G,P); Q:=N/P; until Size(DerivedSubgroup(Q)) <> 120;
! Changed Files
lib/grpperm.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/23
! Changed by
TB
! Type of Change
Fix: inappropriate error message
Fix: efficiency issue
New: new functionality
New: improved documentation
! Description
Now <mixer manual="Reference: IsElementaryAbelian"><span class="code">
IsElementaryAbelian</span></mixer> and
<mixer manual="Reference: ClassPositionsOfMinimalNormalSubgroups"><span 
class="code">ClassPositionsOfMinimalNormalSubgroups</span></mixer>
are available for ordinary character tables.
Now the operation
<mixer manual="Reference: CharacterTableIsoclinic"><span class="code">
CharacterTableIsoclinic</span></mixer> is an attribute,
and there is another new attribute
<mixer manual="Reference: SourceOfIsoclinicTable"><span class="code">
SourceOfIsoclinicTable</span></mixer> that points back to the
original table;
this is used for computing the Brauer tables of those tables in the character
table library that are computed using
<span class="code">CharacterTableIsoclinic</span>.
Now <mixer manual="Reference: ClassPositionsOfDerivedSubgroup"><span 
class="code">ClassPositionsOfDerivedSubgroup</span></mixer> avoids calling
<mixer manual="Reference: Irr"><span class="code">Irr</span></mixer>,
since <mixer manual="Reference: LinearCharacters"><span class="code">
LinearCharacters</span></mixer> is sufficient.
Now <mixer manual="Reference: ClassPositionsOfElementaryAbelianSeries"><span 
class="code">ClassPositionsOfElementaryAbelianSeries</span></mixer>
works also for the table of the trivial group.
Restrictions of character objects know that they are characters.
<br/>

A few formulations in the documentation concerning character tables have
been improved slightly.
! Test Code
gap> tbl:= CharacterTable( ElementaryAbelianGroup( 4 ) );;
gap> IsElementaryAbelian( tbl );                         
true
gap> ClassPositionsOfMinimalNormalSubgroups( tbl );
[ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] ]
gap> if LoadPackage ("ctbllib") <> fail then
>      tbl:= CharacterTableIsoclinic( CharacterTable( "2.A5.2" ) );
>      if tbl mod 3 = fail then
>        Error( CharacterTable( "Isoclinic(2.A5.2)" ), " mod 3" );
>      fi;
>      SourceOfIsoclinicTable( tbl );
>    fi;
gap> tbl:= CharacterTable( Group( () ) );;
gap> ClassPositionsOfElementaryAbelianSeries( tbl );;
! Changed Files
lib/ctbl.gd
lib/ctbl.gi
lib/ctblauto.gd
lib/ctblfuns.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/23
! Changed by
TB
! Type of Change
Fix: efficiency issue
! Description
Up to now, <mixer manual="Reference: CharacterDegrees"><span class="code">
CharacterDegrees</span></mixer> ignored the attribute
<mixer manual="Reference: Irr"><span class="code">Irr</span></mixer>
if the argument was a group that knew that it was solvable.
! Test Code
gap> g:= SymmetricGroup( 4 );; IsSolvable( g );; Irr( g );;
gap> meth:= ApplicableMethod( CharacterDegrees, [ g, 0 ] );;
gap> meth( g, 0 ); 
"TRY_NEXT_METHOD"
! Changed Files
lib/ctblsolv.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/23
! Changed by
TB
! Type of Change
Fix: inappropriate error message
! Description
The function <span class="code">Debug</span> now prints a meaningful message
if the user tries to debug an operation.
Also, the help file for <span class="code">vi</span> is now available in
the case of several <span class="pkgname">GAP</span> root directories.
! Test Code
gap> RereadLib( "debug.g" );
gap> Debug( Size );
Usage: Debug( <func>[, <name>] );
       where <func> is a function but not an operation,
       and   <name> is a string.
! Changed Files
lib/debug.g
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/23
! Changed by
FL
! Reported by
Stefan Kohl
! Type of Change
Fix: internal data corruption
! Description
It is no longer possible to create corrupt objects via ranges of length
&gt;2^28, resp. &gt;2^60 (depending on the architecture). The limitation
concerning the arguments of ranges is documented.
! Test Code
gap> a := 2^(8*GAPInfo.BytesPerVariable-4)-1;;
gap> Unbind( x );
gap> x := [-a..a];;
Range: the length of a range must be less than 2^28
gap> IsBound(x);
false
! Changed Files
src/exprs.c
src/intrprtr.c
doc/build/lists.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/19
! Changed by
SL
! Type of Change
Fix: inappropriate error message
! Description
Now <mixer manual="Reference: Inverse"><span class="code">Inverse</span></mixer>
correctly returns <span class="code">fail</span> for zeros in finite fields
(and does no longer enter a break loop).
! Test Code
gap> Inverse(0*Z(3));
fail
! Changed Files
src/finfield.c
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/24
! Changed by
SL, FL
! Type of Change
New: new and extended functionality
! Description
New operation 
<mixer manual="Reference: Remove"><span class="code">Remove</span></mixer>
and extended functionality of
<mixer manual="Reference: Add"><span class="code">Add</span></mixer> with
an optional argument giving the position of the insertion. They are based
on an efficient kernel function 
<mixer manual="Reference: COPY_LIST_ENTRIES">
<span class="code">COPY_LIST_ENTRIES</span></mixer>.
! Test Code
gap> l:=[1,2];;
gap> Remove(l,1); l;
1
[ 2 ]
gap> Add(l, 100, 1); l;
[ 100, 2 ]
! Changed Files
src/listfunc.c
lib/list.gd
lib/list.gi
lib/alglie.gi
lib/algrep.gi
lib/claspcgs.gi
lib/stbc.gi
doc/build/lists.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/25
! Changed by
JS
! Type of Change
Fix: wrong result
! Description
<mixer manual="Reference: PrimePGroup"><span class="code">
PrimePGroup</span></mixer> is defined to return <span class="code">fail</span> 
for trivial groups, but if the group was constructed as a 
factor or subgroup of a known p-group, the value of p
was retained.
! Test Code
gap> G := Group((1,2));; PrimePGroup(G);
2
gap> PrimePGroup(Subgroup(G,[])); # returns 2 in 4.4.5
fail
! Changed Files
lib/grp.gd
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/25
! Changed by
JS
! Type of Change
Fix: efficiency issue
! Description
Up to now, <mixer manual="Reference: IsPGroup"><span class="code">
IsPGroup</span></mixer> has rarely been set. Now many basic operations
such as <mixer manual="Reference: SylowSubgroup"><span class="code">
SylowSubgroupOp</span></mixer> set this attribute on the returned result.
! Test Code
gap> HasIsPGroup( SylowSubgroup( SymmetricGroup( 5 ), 5 ) ); # false in 4.4.5
true
! Changed Files
grp/basicpcg.gi
lib/gpprmsya.gi
lib/grp.gd
lib/grp.gi
lib/grppcatr.gi
lib/grpperm.gi
lib/grpprmcs.gi
! End
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/26
! Changed by
Max
! Type of Change
Fix: design improvement
! Description
Make "<span class="code">MutableCopyMat</span>" an operation and install 
the former function which does call <mixer manual="Reference: List">
<span class="code">List</span></mixer> with
<mixer manual="Reference: ShallowCopy"><span class="code">
ShallowCopy</span></mixer> the default method for lists. Also
use this in a few appropriate places.
! Test Code
gap> IsOperation(MutableCopyMat);
true
! Changed Files
lib/matrix.gd
lib/matrix.gi
doc/build/matrix.msk
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/26
! Changed by
BH,FL
! Type of Change
Fix: page references in manuals
! Description
Fixed wrong page references in manual indices.
! Changed Files
doc/gapmacro.tex
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/29
! Changed by
TB
! Type of Change
New: extended functionality
! Description
In test files that are read with <mixer manual="Reference: ReadTest">
<span class="code">ReadTest</span></mixer>,
the assertion level is set to 2 between <span class="code">START_TEST</span>
and <span class="code">STOP_TEST</span>.
This may result in runtimes for the tests that are substantially longer
than the usual runtimes with default assertion level 0.
In particular this is the reason why some of the standard test files require
more time in <span class="pkgname">GAP</span> 4.4.6 than in
<span class="pkgname">GAP</span> 4.4.5.
! Changed Files
lib/profile.g
lib/grppcnrm.gi
lib/meataxe.gi
! End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
! Date
2005/08/29
! Changed by
TB
! Reported by
Burkhard Höfling
! Type of Change
Fix: wrong result
! Description
The functions <mixer manual="Reference: TestPackageAvailability"><span 
class="code">TestPackageAvailability</span></mixer>
and <mixer manual="Reference: LoadPackage"><span class="code">
LoadPackage</span></mixer> did not work correctly when one asked for a 
particular version of the package, via a version number starting with
the character <span class="code">=</span>, in the sense that a version
with a larger version number was loaded if it was available.
! Test Code
gap> LoadPackage( "ctbllib", "=0.0" );
fail
! Changed Files
lib/package.g
! End

